package services

import (
	"blog-backend/internal/app/models"
	"blog-backend/internal/app/repositories"
	"errors"
)

type TagService struct {
	tagRepo *repositories.TagRepository
}

func NewTagService() *TagService {
	return &TagService{
		tagRepo: repositories.NewTagRepository(),
	}
}

// GetTags 获取所有标签
func (s *TagService) GetTags() ([]models.Tag, error) {
	return s.tagRepo.GetAll()
}

// GetOrCreateTag 获取或创建标签
func (s *TagService) GetOrCreateTag(name string) (*models.Tag, error) {
	// 检查标签是否已存在
	tag, err := s.tagRepo.GetByName(name)
	if err == nil {
		return tag, nil
	}
	
	// 创建新标签
	tag = &models.Tag{
		Name: name,
		Slug: generateSlug(name),
	}
	
	if err := s.tagRepo.Create(tag); err != nil {
		return nil, errors.New("创建标签失败")
	}
	
	return tag, nil
}

// UpdatePostTags 更新文章标签
func (s *TagService) UpdatePostTags(postID uint, tagNames []string) error {
	// 清除文章现有标签
	if err := s.tagRepo.ClearPostTags(postID); err != nil {
		return errors.New("清除标签失败")
	}
	
	// 添加新标签
	for _, name := range tagNames {
		tag, err := s.GetOrCreateTag(name)
		if err != nil {
			return err
		}
		
		if err := s.tagRepo.AddTagToPost(postID, tag.ID); err != nil {
			return errors.New("添加标签失败")
		}
	}
	
	return nil
}